﻿///////////////////////////////////////////////////////////////////////////////
// File:        CircleBuffer.hpp
// Author:      671643387@qq.com
// Date:        2016年1月5日 下午5:42:28
// Description:
///////////////////////////////////////////////////////////////////////////////

#ifndef UTIL_CIRCLEBUFFER_HPP_
#define UTIL_CIRCLEBUFFER_HPP_

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif

#include <vector>
#include <boost/noncopyable.hpp>
#include <fog/Typedef.hpp>

namespace fog
{
    namespace util
    {
        class CircleBuffer : public boost::noncopyable
        {
        public:
            CircleBuffer(std::size_t size);
            ~CircleBuffer(void);

        public:
            std::size_t read(BYTE_t *buf, std::size_t size);
            std::size_t write(const BYTE_t *buf, std::size_t size);
            std::size_t peek(BYTE_t *buf, std::size_t size);
            std::size_t skip(std::size_t size);
            std::size_t capacity(void) { return capacity_; }
            std::size_t space(void) { return capacity_ - size_; }
            std::size_t size(void) { return size_; }

        private:
            std::size_t             capacity_;
            std::size_t             size_;
            std::size_t             rpos_;
            std::size_t             wpos_;
            std::vector<BYTE_t>     buf_;
        };
    }
}

#endif /* UTIL_CIRCLEBUFFER_HPP_ */
